/**
 * unit，该工具包依赖 rand 封装获取指定长度的随机数，不保证唯一性
 * 创建者：Bryce
 * 创建时间：20210901
 */
package unit

import (
	"fmt"
	"math/rand"
	"strconv"
	"strings"
	"time"
)

var t int64 = 1

/**
 * GetRandomString，获取指定长度的的字符串随机数
 * Params：
 *   len：长度
 *   cate：字母大小写，0-小写（默认），1-大写
 * Return：
 *   随机字符串
 */
func GetRandomString(len int, cate ...int) string {
	rand.Seed(time.Now().UnixNano() + t)
	t++
	randBytes := make([]byte, len/2)
	rand.Read(randBytes)
	str := fmt.Sprintf("%x", randBytes)
	if cate != nil && cate[0] == 1 {
		return strings.ToUpper(str)
	}
	return str
}

/**
 * GetRandomString，获取指定范围的随机数
 * Params：
 *   min：最小值
 *   max：最大值
 *   len：填充长度
 * Return：
 *   随机数
 */
func GetRandomInt(min, max int) int {
	return rand.Intn(max-min) + min
}

/**
 * GetRandomString，获取指定范围的随机数并填充指定数字到指定长度
 * Params：
 *   min：最小值
 *   max：最大值
 *   l：长度
 *   f：填充值
 *   d：方向，左填充-left（默认）,右填充-right
 * Return：
 *   随机数
 */
func GetRandomIntFill(min, max, l int, f string, d ...string) string {
	num := strconv.Itoa(GetRandomInt(min, max))

	length := len(num)
	if l < length {
		return num
	}

	fill := strings.Repeat(f, l-len(num))
	if d != nil && d[0] == "right" {
		return num + fill
	}

	return fill + num
}
